STM32 HAL库串口注意点

STM32 HAL库串口注意点


现象


STM32CubeMX提供了串口的HAL库,网上能找到很多例子,但是真正运行起来会时不时卡死。

原因


代码中使用了在

1
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

函数中调用

1
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

重新启动中断,并将数据送入队列的方法。

会造成两个问题:

HAL_UART_Receive_IT中检测__HAL_LOCK(huart),中断外调用HAL_UART_Transmit时也会锁定此huart,再进入接收中断时有几率造成死锁。
发生OverRun错误会停止中断。

解决方法


定期检测串口,防止死锁造成的无法恢复的失败。
写好HAL_UART_ErrorCallback函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
// define and initial variables outside
extern UART_HandleTypeDef huart3;
volatile char data;
extern osMessageQId rxQHandle;

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if (huart->Instance == USART3){
BaseType_t xHigherPriorityTaskWoken;
xHigherPriorityTaskWoken = pdTRUE;
xQueueSendFromISR(rxQHandle, (void*)&data, &xHigherPriorityTaskWoken);
if (HAL_UART_Receive_IT(huart, (uint8_t*)&data ,1) != HAL_OK){
// fail ++;
}
}
}

void HAL_UART_ErrorCallback(UART_HandleTypeDef* huart){
uint32_t isrflags = READ_REG(huart->Instance->SR);
if((__HAL_UART_GET_FLAG(huart, UART_FLAG_PE))!=RESET)
{
__HAL_UART_CLEAR_PEFLAG(huart);
}
if((__HAL_UART_GET_FLAG(huart, UART_FLAG_FE))!=RESET)
{
__HAL_UART_CLEAR_FEFLAG(huart);
}
if((__HAL_UART_GET_FLAG(huart, UART_FLAG_NE))!=RESET)
{
__HAL_UART_CLEAR_NEFLAG(huart);
}
if((__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE))!=RESET)
{
__HAL_UART_CLEAR_OREFLAG(huart);
}
huart->RxState = HAL_UART_STATE_READY;
huart->ErrorCode = HAL_UART_ERROR_NONE;

__HAL_UART_DISABLE_IT(huart, UART_IT_RXNE);
__HAL_UART_DISABLE_IT(huart, UART_IT_PE);
__HAL_UART_DISABLE_IT(huart, UART_IT_ERR);


if (huart->Instance == USART3){
if (HAL_UART_Receive_IT(huart, (uint8_t*)&data ,1) != HAL_OK){
}
}
}

void call_this_function_periodically(ali_cloud* app){
if ((__HAL_UART_GET_FLAG(&huart3, UART_FLAG_ORE) != RESET) || (huart3.Instance->CR1 & USART_CR1_RXNEIE == RESET)) {
__disable_irq();
HAL_UART_ErrorCallback(&huart3);
__enable_irq();
}
}

总结


STM32的用户较少,网上资料不可轻信,使用任何外设都要详细查找坑的所在。

STM32的官方资料不全。

简单的东西出现小问题也很耗时间,还是需要熟悉各种细节的人相互配合。

Комментарии

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×